<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// 在JavaScript中，`call`、`apply`和`bind`是`Function`对象自带的三个方法。
	// function fn(){
	//
	// }
	
	
	// * call 的参数是直接放进去的，第二第三第 n 个参数全都用逗号分隔，直接放到后面
	// * apply 的所有参数都必须放在一个数组里面传进去
	// * bind 除了返回是函数以外，它的参数和 call 一样
	
	// function fn(a,b,c){
	// 	console.log(this,a,b,c);
	// }
	// // fn(1,2,3);// 调用fn函数，并传递参数1 2 3
	// // fn.call();// 调用fn函数: window undefined undefined
	// // fn.call(undefined);// 调用fn函数: window undefined undefined undefined
	// // fn.call(undefined,10,20,30);// 调用fn函数,指定函数内的this为undefined,但是函数内的this指向window,传递参数为10 20 30: window 10 20 30
	// // fn.call(null,10,20,30);// 调用fn函数,指定函数内的this为null,但是函数内的this指向window,传递参数为10 20 30: window 10 20 30
	// // fn.call(1,10,20,30);// 调用fn函数,指定函数内的this为1,但是函数内的this指向其包装对象,传递参数为10 20 30: Number{} 10 20 30
	// // fn.call("1",10,20,30);// 调用fn函数,指定函数内的this为"1",但是函数内的this指向其包装对象,传递参数为10 20 30: String{} 10 20 30
	// // fn.call(true,10,20,30);// 调用fn函数,指定函数内的this为true,但是函数内的this指向其包装对象,传递参数为10 20 30: Boolean{} 10 20 30
	// // fn.call(function(){console.log(1)},10,20,30);// 调用fn函数,指定函数内的this为函数,函数内的this指向该函数,传递参数为10 20 30: Boolean{} 10 20 30
	// // fn.call([1,2,3],10,20,30);// 调用fn函数,指定函数内的this为数组,函数内的this就指向数组,传递参数为10 20 30: [] 10 20 30
	// // fn.call({},10,20,30);// 调用fn函数,指定函数内的this为{},函数内的this指向{}},传递参数为10 20 30: {} 10 20 30
	
	
	// function fn(a,b,c){
	// 	console.log(this,a,b,c);
	// }
	// fn(1,2,3);// 调用fn函数，并传递参数1 2 3
	// fn.apply();// 调用fn函数: window undefined undefined
	// fn.apply(undefined);// 调用fn函数: window undefined undefined undefined
	// fn.apply(undefined,[10,20,30]);// 调用fn函数,指定函数内的this为undefined,但是函数内的this指向window,传递参数为10 20 30: window 10 20 30
	// fn.apply(null,[10,20,30]);// 调用fn函数,指定函数内的this为null,但是函数内的this指向window,传递参数为10 20 30: window 10 20 30
	// fn.apply(1,[10,20,30]);// 调用fn函数,指定函数内的this为1,但是函数内的this指向其包装对象,传递参数为10 20 30: Number{} 10 20 30
	// fn.apply("1",[10,20,30]);// 调用fn函数,指定函数内的this为"1",但是函数内的this指向其包装对象,传递参数为10 20 30: String{} 10 20 30
	// fn.apply(true,[10,20,30]);// 调用fn函数,指定函数内的this为true,但是函数内的this指向其包装对象,传递参数为10 20 30: Boolean{} 10 20 30
	// fn.apply(function(){console.log(1)},[10,20,30]);// 调用fn函数,指定函数内的this为函数,函数内的this指向该函数,传递参数为10 20 30: Boolean{} 10 20 30
	// fn.apply([1,2,3],[10,20,30]);// 调用fn函数,指定函数内的this为数组,函数内的this就指向数组,传递参数为10 20 30: [] 10 20 30
	// fn.apply({},[10,20,30]);// 调用fn函数,指定函数内的this为{},函数内的this指向{}},传递参数为10 20 30: {} 10 20 30


	// bind
	// function fn(a,b,c){
	// 	console.log(this,a,b,c);
	// }
	// fn.bind()();// 等同于 fn.call()   等同于fn()
	// fn.bind(1)();// 等同于 fn.call(1)
	// fn.bind([],1,2,3)();// 等同于 fn.call([],1,2,3)
	
	// 会返回一个函数(fn2），该函数（fn2）中的this为{}，接收的参数值为1 2
	// fn2与fn函数体内容相同
	// const fn2 = fn.bind({},1,2);
	// fn2(300);
	

</script>
</html>